package com.example.demo.common;


import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 保底统一返回数据格式的封装
 * 当返回的数据不是 AjaxResult 的时候转换成 AjaxResult
 *
 * 注解：@ControllerAdvice + 实现方法 ResponseBodyAdvice
 */

@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
//        return false;
        /**
         * 内容是否需要重写（通过此⽅法可以选择性部分控制器和⽅法进⾏重写）
         * 返回 true 表示重写
         */
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        /**
         * instanceof 判断是否是统一类型的
         * instanceof 关键字可以用于检查一个对象是否是某个类的实例，或者检查一个对象是否是某个类的子类
         */
        if(body instanceof AjaxResult) return body;


        // 在此处进行判断 body 的内容，如果是 字符串 进行单独处理
        // 还需要注入 ObjectMapper 对象
        // @Autowired
        // private ObjectMapper objectMapper; // 用于将 Java对象 和 json 字符串进行相互转换
        // 方案1：writeValueAsString 作用：不要让 string 进行类型转换，直接就是 string 就可以了，string转换有问题
        // 方案2：在config中进行配置，移除掉 string 的httpmassage
        if(body instanceof String) {
            return objectMapper.writeValueAsString(AjaxResult.success(body));
        }
        return AjaxResult.success(body);
    }
}
